package com.linln.modules.member.service.impl;

import com.linln.common.data.PageSort;
import com.linln.common.enums.StatusEnum;
import com.linln.modules.member.domain.MemberInfo;
import com.linln.modules.member.domain.MemberPayDayCount;
import com.linln.modules.member.repository.MemberInfoRepository;
import com.linln.modules.member.service.MemberInfoService;
import com.linln.modules.system.domain.User;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

/**
 * @author hct
 * @date 2019/09/12
 */
@Service
public class MemberInfoServiceImpl implements MemberInfoService {

    @Autowired
    private MemberInfoRepository memberInfoRepository;

    /**
     * 根据ID查询数据
     * @param id 主键ID
     */
    @Override
    @Transactional
    public MemberInfo getById(Long id) {
        return memberInfoRepository.findById(id).orElse(null);
    }

    /**
     * 获取分页列表数据
     * @param example 查询实例
     * @return 返回分页数据
     */
    @Override
    public Page<MemberInfo> getPageList(Example<MemberInfo> example) {
        // 创建分页对象
        PageRequest page = PageSort.pageRequest();
        return memberInfoRepository.findAll(example, page);
    }
    
    
    /**
     * 获取分页列表数据
     * @param example 查询实例
     * @return 返回分页数据
     */
    @Override
    public Page<MemberInfo> getPageList(Example<MemberInfo> example,Integer pageNumber) {
        // 创建分页对象
    	Sort sort = new Sort(Sort.Direction.DESC, "id");
    	if(pageNumber==null)pageNumber=1;
    	PageRequest page = PageSort.pageRequest(pageNumber,sort);
        return memberInfoRepository.findAll(example, page);
    }

    
    @SuppressWarnings("serial")
	public Page<MemberInfo> getPageList(String startTime,String endTime,String nickname,String mobile,
			Integer status){
    	  // 创建分页对象
        PageRequest page = PageSort.pageRequest(Sort.Direction.ASC);

        // 使用Specification复杂查询
        return memberInfoRepository.findAll(new Specification<MemberInfo>(){

            @Override
            public Predicate toPredicate(Root<MemberInfo> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> preList = new ArrayList<>();
                if(startTime!= null){
                    preList.add(cb.greaterThanOrEqualTo(root.get("registerDate").as(String.class), startTime));
                     
                }
                
                if(endTime!= null){
                	  preList.add(cb.lessThanOrEqualTo(root.get("registerDate").as(String.class), startTime));
                }                
                

                if(nickname!= null){
                	  preList.add(cb.like(root.get("nickname").as(String.class), "%"+nickname+"%"));
                } 
                if(mobile!= null){
              	  preList.add(cb.like(root.get("mobile").as(String.class), "%"+mobile+"%"));
              }    
                if(status!= null){
              	  preList.add(cb.equal(root.get("status").as(Integer.class), status));
              }                
              
                Predicate[] pres = new Predicate[preList.size()];
                return query.where(preList.toArray(pres)).getRestriction();
            }

        }, page);
    }

    /**
     * 保存数据
     * @param memberInfo 实体对象
     */
    @Override
    public MemberInfo save(MemberInfo memberInfo) {
        return memberInfoRepository.save(memberInfo);
    }

    /**
     * 状态(启用，冻结，删除)/批量状态处理
     */
    @Override
    @Transactional
    public Boolean updateStatus(StatusEnum statusEnum, List<Long> idList) {
        return memberInfoRepository.updateStatus(statusEnum.getCode(), idList) > 0;
    }
    
    
    
    /**
     * 根据用户名查询用户数据
     * @param username 用户名
     * @return 用户数据
     */
    @Override
    public MemberInfo getByName(String username) {
        return memberInfoRepository.findByNickname(username);
    }
    @Override
    public MemberInfo getByMobile(String mobile) {
        return memberInfoRepository.findByMobile(mobile);
    }
    @Override
    public MemberInfo getByOpenId(String openId) {
        return memberInfoRepository.findByOpenid(openId);
    }

    
    /**
     * 用户名是否存在
     * @param user 用户对象
     * @return 用户数据
     */
    @Override
    public Boolean repeatByUsername(MemberInfo user) {
        Long id = user.getId() != null ? user.getId() : Long.MIN_VALUE;
        return memberInfoRepository.findByNicknameAndIdNot(user.getNickname(), id) != null;
    }
    
    
  /**
	     * 根据区域获取总数量
	* @param area
	* @return
	*/
	public Integer  getCountByArea(String area) {
		return memberInfoRepository.getCountByArea(area);
	}
	
	
	public Integer  getCountByAreaAndToday(String area) {
		return memberInfoRepository.getCountByAreaAndToday(area);

    }

    
    /**
     * 根据区域获取总数量
* @param area
* @return
*/
public long  getAllCount(Example<MemberInfo> example) {
	return memberInfoRepository.count(example);
}

}